// 权限拦截 导航守卫 路由守卫  router
import router from "@/router"; // 引入路由实例
import store from "@/store"; // 引入vuex store实例
import NProgress from "nprogress"; // 引入一份进度条插件
import "nprogress/nprogress.css"; // 引入进度条样式
//console.log(store,444);
const whiteList = ["/login", "/404"]; // 定义白名单  所有不受权限控制的页面
router.beforeEach(async (to, from, next) => {
  NProgress.start(); // 开启进度条
  //  首先判断有无token
  if (store.getters.token) {
    if (to.path == "/login") {
      next("/");
    } else {
      // 如果当前vuex中有用户的资料的id 表示 已经有资料了 不需要获取了 如果没有id才需要获取
      if (!store.getters.userId) {
        //console.log(1);
        const res = await store.dispatch("user/getUserInfo");
        // console.log(res.roles.menus, 456);
        //  获取动态路由

        const routes = await store.dispatch(
          "permission/filterRoutes",
          res.roles.menus
        );
        //console.log(routes, 888);
        /* 
          routes就是筛选得到的动态路由
          动态路由 添加到 路由表中 默认的路由表 只有静态路由 没有动态路由
         // addRoutes  必须 用 next(地址) 不能用next()
        
         */
        router.addRoutes([
          ...routes,
          { path: "*", redirect: "/404", hidden: true }
        ]);
        next(to.path);
      }
      next();
    }
  } else {
    // 没有token
    if (whiteList.indexOf(to.path) > -1) {
      next();
    } else {
      next("/login");
    }
  }
  NProgress.done(); // 手动强制关闭一次  为了解决 手动切换地址时  进度条的不关闭的问题
});

// 后置守卫
router.afterEach(function() {
  NProgress.done(); // 关闭进度条
});
